package com.yzq.manager.WebSocket.disruptor;

import cn.hutool.json.JSONUtil;
import com.lmax.disruptor.WorkHandler;

import com.yzq.manager.WebSocket.PictureEditHandler;

import com.yzq.manager.WebSocket.model.PictureEditMessageTypeEnum;
import com.yzq.manager.WebSocket.model.PictureEditRequestMessage;
import com.yzq.manager.WebSocket.model.PictureEditResponseMessage;
import com.yzq.model.vo.UserVO;
import com.yzq.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;

import javax.annotation.Resource;

/**
 * 图片编辑事件处理器（消费者）
 * 用于处理从 Disruptor 环形队列中消费到的图片编辑事件
 */
@Component
@Slf4j
public class PictureEditEventWorkHandler implements WorkHandler<PictureEditEvent> {

    /**
     * 注入图片编辑处理器，用于处理具体的业务逻辑
     */
    @Resource
    private PictureEditHandler pictureEditHandler;

    /**
     * 注入用户服务，用于获取用户信息
     */
    @Resource
    private UserService userService;

    /**
     * 处理 Disruptor 环形队列中的事件
     * 根据消息类型调用不同的处理方法
     *
     * @param pictureEditEvent 图片编辑事件对象，包含消息、会话、用户和图片ID等信息
     * @throws Exception 处理过程中可能抛出的异常
     */
    @Override
    public void onEvent(PictureEditEvent pictureEditEvent) throws Exception {
        // 从事件对象中获取相关信息
        PictureEditRequestMessage pictureEditRequestMessage = pictureEditEvent.getPictureEditRequestMessage();
        WebSocketSession session = pictureEditEvent.getSession();
        UserVO user = pictureEditEvent.getUser();
        Long pictureId = pictureEditEvent.getPictureId();
        log.info("处理图片编辑消息：{}", pictureEditRequestMessage); 
        
        // 获取消息类型并转换为枚举
        String type = pictureEditRequestMessage.getType();
        PictureEditMessageTypeEnum pictureEditMessageTypeEnum = PictureEditMessageTypeEnum.getEnumByValue(type);
        log.info("处理图片编辑消息：{}", pictureEditRequestMessage);
        // 根据消息类型执行相应的处理逻辑
        switch (pictureEditMessageTypeEnum) {
            // 处理进入编辑状态的消息
            case ENTER_EDIT:
                pictureEditHandler.handleEnterEditMessage(pictureEditRequestMessage, session, user, pictureId);
                break;
            // 处理退出编辑状态的消息
            case EXIT_EDIT:
                pictureEditHandler.handleExitEditMessage(pictureEditRequestMessage, session, user, pictureId);
                break;
            // 处理编辑操作的消息
            case EDIT_ACTION:
                pictureEditHandler.handleEditActionMessage(pictureEditRequestMessage, session, user, pictureId);
                break;
                case GET_ONLINE_USERS:
                    pictureEditHandler.handleGetOnlineUsersMessage(pictureEditRequestMessage, session, user, pictureId);
                break;
            // 处理未知或不支持的消息类型
            default:
                // 构造错误响应消息
                PictureEditResponseMessage pictureEditResponseMessage = new PictureEditResponseMessage();
                pictureEditResponseMessage.setType(PictureEditMessageTypeEnum.ERROR.getValue());
                pictureEditResponseMessage.setMessage("消息类型错误");
                pictureEditResponseMessage.setUser(user);
                // 将错误信息发送给当前用户
                session.sendMessage(new TextMessage(JSONUtil.toJsonStr(pictureEditResponseMessage)));
                break;
        }
    }
}
